#ifndef _SQSTRING_H_
#define _SQSTRING_H_

inline SQHash _hashstr( const SQChar *s, size_t l ) {
  SQHash h = ( SQHash )l;
  size_t step = ( l >> 5 ) | 1;
  for( ; l >= step; l -= step ) {
    h = h ^ ( ( h << 5 ) + ( h >> 2 ) + ( unsigned short ) * ( s++ ) );
  }
  return h;
}

struct SQString : public SQRefCounted {
    SQString() {}
    ~SQString() {}
  public:
    static SQString *Create( SQSharedState *ss, const SQChar *, SQInteger len = -1 );
    SQInteger Next( const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval );
    void Release();
    SQSharedState *_sharedstate;
    SQString *_next;
    SQInteger _len;
    SQHash _hash;
    SQChar _val[1];
};

#endif
